package persistencia;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import negocio.Comanda;
import negocio.ItemComanda;
import negocio.Mesa;
import negocio.Mozo;

public class DAOComanda {
	private static DAOComanda instancia;
	private DAOComanda(){
		
	}
	public static DAOComanda getInstancia() {
		if(instancia == null)
			return instancia = new DAOComanda();
		return instancia;
	}
	public Collection<Comanda> obtenerComandas()
	{
		Connection connection = AdministradorDeConexion.getInstancia().connect();
		try{
			Collection<Comanda> comandas = new ArrayList<Comanda>();
			String query =  "Select * from Comanda";
			PreparedStatement preparedStatement = null;
			preparedStatement = connection.prepareStatement(query);
			preparedStatement.execute();
			ResultSet result = preparedStatement.executeQuery();

			while (result.next()){
				System.out.println("BLA");
				//TUVE QUE DEJAR EL 0 PORQUE LA CANTIDAD DE PERSONAS EN LA COMANDA NUNCA SE GUARDA.
				//COMENTO ESTE COMANDAS.ADD DADO QUE NO TIENE TODOS LOS DATOS QUE SE NECESITAN PARA ESTABLECER UNA COMANDA.
				//comandas.add(new Comanda(DAOMozo.getInstancia().buscarMozo(result.getInt("NroEmpleado")), DAOItemComanda.getInstancia().buscarTodosLosItemsDeLaComanda(result.getInt("NroComanda")),0));
				comandas.add(
							new Comanda(
										result.getInt("NroComanda"), 
										result.getString("Estado"), 
										result.getDate("Hora"), 
										DAOMozo.getInstancia().buscarMozo(result.getInt("NroEmpleado")), 
										DAOItemComanda.getInstancia().buscarTodosLosItemsDeLaComanda(result.getInt("NroComanda")), 
										result.getInt("CantPersonas"), 
										result.getInt("TiempoDemora")));
				System.out.println(comandas.size());
			}
			return comandas;
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
			return null;	
		}
	}
	public Comanda obtenerComanda(int nroComanda)
	{
		Connection connection = AdministradorDeConexion.getInstancia().connect();
		try{
			Comanda comanda = null;
			String query =  "Select * from Comanda where NroComanda = " + String.valueOf(nroComanda);
			PreparedStatement preparedStatement = null;
			preparedStatement = connection.prepareStatement(query);
			preparedStatement.execute();
			ResultSet result = preparedStatement.executeQuery();

			while (result.next()){
				//TUVE QUE DEJAR EL 0 PORQUE LA CANTIDAD DE PERSONAS EN LA COMANDA NUNCA SE GUARDA.
				//COMENTO ESTE COMANDAS.ADD DADO QUE NO TIENE TODOS LOS DATOS QUE SE NECESITAN PARA ESTABLECER UNA COMANDA.
				//comandas.add(new Comanda(DAOMozo.getInstancia().buscarMozo(result.getInt("NroEmpleado")), DAOItemComanda.getInstancia().buscarTodosLosItemsDeLaComanda(result.getInt("NroComanda")),0));
				 comanda = 	new Comanda(
										result.getInt("NroComanda"), 
										result.getString("Estado"), 
										result.getDate("Hora"), 
										DAOMozo.getInstancia().buscarMozo(result.getInt("NroEmpleado")), 
										DAOItemComanda.getInstancia().buscarTodosLosItemsDeLaComanda(result.getInt("NroComanda")), 
										result.getInt("CantPersonas"), 
										result.getInt("TiempoDemora"));
				
			}
			return comanda;
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
			return null;	
		}
	}
	public void crearComanda(Comanda comanda, Mesa mesa){
		Connection connection = AdministradorDeConexion.getInstancia().connect();
		try{
		String query =  "INSERT INTO Comanda ([NroComanda],[Estado],[Hora],[CantPersonas],[TiempoDemora],[NroEmpleado],[NroMesa]) VALUES(?,?,?,?,?,?,?)";
		PreparedStatement preparedStatement = null;
		preparedStatement = connection.prepareStatement(query);
		preparedStatement.setInt(1, comanda.getNroComanda());
		preparedStatement.setString(2, comanda.getEstado());
		preparedStatement.setDate(3, comanda.getHora());
		preparedStatement.setInt(4, comanda.getCantidadPersonas());
		preparedStatement.setInt(5, comanda.getTiempoDeDemora());
		preparedStatement.setInt(6, comanda.getMozo().getNroEmpleado());
		preparedStatement.setInt(7, mesa.getNroMesa());
		preparedStatement.execute();	
		AdministradorDeConexion.getInstancia().closeConnection(connection);
		System.out.println("Info: DAOComida.crearComida(): La Comanda " + comanda.getNroComanda() + " se ha cargado exitosamente en la Base de Datos.");
		
			// Recorro el vector de ItemsComanda de mi Comanda para persistirlo en la Base de Datos.
		
			for (ItemComanda itemComanda: comanda.getItemsComanda()){
					DAOItemComanda.getInstancia().crearItemComanda(comanda.getNroComanda(), itemComanda);
			}
		}
		catch (SQLException e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOComanda.crearComanda(): Error al intentar crear la Comanda " +
			comanda.getNroComanda() + " en la Base de Datos. " + e.getLocalizedMessage());
		}
		catch (Exception e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOComanda.crearComanda(): Error al intentar crear la Comanda " +
			comanda.getNroComanda() + " en la Base de Datos. " + e.getLocalizedMessage());
		}
	}
	public void UpdateTiempoDemoraComanda(Comanda comanda){
		Connection connection = AdministradorDeConexion.getInstancia().connect();
		try{
		String query =  "Update comanda set TiempoDemora = " + comanda.getTiempoDeDemora() + " ,Estado = '" + comanda.getEstado() + "' where NroComanda = " + comanda.getNroComanda();
		PreparedStatement preparedStatement = null;
		preparedStatement = connection.prepareStatement(query);
		preparedStatement.execute();	
		AdministradorDeConexion.getInstancia().closeConnection(connection);
		}
		catch (SQLException e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOComanda.crearComanda(): Error al intentar crear la Comanda " +
			comanda.getNroComanda() + " en la Base de Datos. " + e.getLocalizedMessage());
		}
		catch (Exception e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOComanda.crearComanda(): Error al intentar crear la Comanda " +
			comanda.getNroComanda() + " en la Base de Datos. " + e.getLocalizedMessage());
		}
	}
	public Collection<Comanda> obtenerComandas(int nroMesa) {
		Connection connection = AdministradorDeConexion.getInstancia().connect();
		try{
			Collection<Comanda> comandas = new ArrayList<Comanda>();
			String query =  "Select * from Comanda where NroMesa = " + String.valueOf(nroMesa);
			PreparedStatement preparedStatement = null;
			preparedStatement = connection.prepareStatement(query);
			preparedStatement.execute();
			ResultSet result = preparedStatement.executeQuery();

			while (result.next()){
				//TUVE QUE DEJAR EL 0 PORQUE LA CANTIDAD DE PERSONAS EN LA COMANDA NUNCA SE GUARDA.
				//COMENTO ESTE COMANDAS.ADD DADO QUE NO TIENE TODOS LOS DATOS QUE SE NECESITAN PARA ESTABLECER UNA COMANDA.
				//comandas.add(new Comanda(DAOMozo.getInstancia().buscarMozo(result.getInt("NroEmpleado")), DAOItemComanda.getInstancia().buscarTodosLosItemsDeLaComanda(result.getInt("NroComanda")),0));
				
				comandas.add(new Comanda(
						
										result.getInt("NroComanda"), 
										result.getString("Estado"), 
										result.getDate("Hora"), 
										DAOMozo.getInstancia().buscarMozo(result.getInt("NroEmpleado")), 
										DAOItemComanda.getInstancia().buscarTodosLosItemsDeLaComanda(result.getInt("NroComanda")), 
										result.getInt("CantPersonas"), 
										result.getInt("TiempoDemora")));
				
			}
			
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			return comandas;
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
			return null;	
		}
	}
	
}

